﻿/*定义一个函数，输入一个链表的头节点，反转该链表并输出反转后链表的头节点。

示例:

输入: 1->2->3->4->5->NULL
输出: 5->4->3->2->1->NULL
 
限制：
0 <= 节点个数 <= 5000
*/
#include <iostream>
#include <vector>
using namespace std;


struct ListNode {
    int val;
    ListNode* next;
    ListNode(int x) : val(x), next(NULL) {}
};

/*
我的暴力解法：装到vector里面，倒着输出来
*/
//错的
//class Solution {
//public:
//    ListNode* reverseList(ListNode* head) {
//        vector<int> obj;
//        ListNode* p = head;
//        int n = 0;
//        while (p!=NULL) {
//            p = p->next;
//            obj.push_back(p->val);
//            n++;
//        }
//        for (int i = n;i > 0;i--)//size()容器中实际数据个数 
//        {
//            cout << obj[i] << "->";
//        }
//    }
//};

/*大佬解法：
定义两个指针： prepre 和 curcur ；prepre 在前 curcur 在后。
每次让 prepre 的 nextnext 指向 curcur ，实现一次局部反转
局部反转完成之后， prepre 和 curcur 同时往前移动一个位置
循环上述过程，直至 prepre 到达链表尾部
*/
class Solution {
public:
    ListNode* reverseList(ListNode* head) {
        ListNode* pre = head;
        ListNode* cur = NULL;
        while (pre!= NULL) {
            ListNode* t = pre->next;
            pre->next = cur;
            cur = pre;
            pre = t;
        }
        return cur;
    }
};